package com.csb.service.impl;

import com.csb.config.MyConstants;
import com.csb.mapper.ApplyMapper;
import com.csb.mapper.AssetMapper;
import com.csb.pojo.Apply;
import com.csb.service.AroService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import java.util.List;

@Service
public class AroServiceImpl implements AroService {
    // 依赖
    @Autowired
    private ApplyMapper applyMapper;
    @Autowired
    private AssetMapper assetMapper;

    /**
     * 获取待审批一览
     *
     * @param applyInit
     * @return
     */
    @Override
    public List<Apply> getApprovalNoList(int applyInit) {
        return applyMapper.getApprovalNoList(applyInit);
    }

    /**
     * 同意资产的申请
     *
     * @param ids
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean yesApplyInfo(String[] ids, String approvalAccount) {
        /*
         * 1:获取所申请的流水号数组
         * 2:获取当前用户的账号即使审批者
         * 3:根据1,批量更新申请表
         * 3.1 回填申请单据的状态(1->2),同时设置审批者的账号
         * 4:遍历1
         * 4.1根据当前申请流水号,获取申请信息(资产编号,申请者账号,业务类型)
         * 4.2:如果业务类型是"申请"的话,根据资产编号,回填资产的状态(2->3 申请中->在用),同时设置使用者账号
         * 4.3:如果业务类型是"归还"的话,根据资产编号,回填资产的状态(2->1 申请中->待用),同时设置使用者账号为null
         */
        try {
            // 批量更新申请表
            applyMapper.batchUpdateApplyInfo(ids, MyConstants.APPLY_YES, approvalAccount);
            // 遍历ids
            for (String id : ids) {
                // 根据当前申请流水号,获取申请信息(资产编号,申请者账号)
                Apply app = applyMapper.getAppInfoById(id);
                // 获取当前业务类型
                int business = app.getIsBack();
                // 判断
                // 申请
                if (business == 1) {
                    // 根据资产编号,回填资产的状态(2->3 申请中->在用),同时设置使用者账号
                    assetMapper.updateAssetState(app, MyConstants.ASSET_ASSTATE_USING);
                    // 归还
                } else if (business == 0) {
                    // 设置使用者为null
                    app.setApplyer(null);
                    // 根据资产编号,回填资产的状态(2->1 申请中->待用),同时设置使用者账号为null
                    assetMapper.updateAssetState(app, MyConstants.ASSET_ASSTATE_NOUSE);
                }
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            // 强制手动回滚事务
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return false;
        }
    }

    /**
     * 不同意资产的申请
     *
     * @param ids
     * @param approvalAccount
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean noApplyInfo(String[] ids, String approvalAccount) {
        try {
            applyMapper.batchUpdateApplyInfo(ids, MyConstants.APPLY_NO, approvalAccount);
            // 遍历ids
            for (String id : ids) {
                // 根据当前申请流水号,获取申请信息(资产编号,申请者账号)
                Apply app = applyMapper.getAppInfoById(id);
                // 将申请者设置为null
                app.setApplyer(null);
                // 根据资产编号,回填资产的状态(2->3 申请中->在用/2->1 申请中->待用),同时设置使用者账号为null
                assetMapper.updateAssetState(app, MyConstants.ASSET_ASSTATE_NOUSE);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            // 强制手动回滚事务
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return false;
        }
    }
}
